package _1_goodfirst;

public class _5_Array 
{
	public static void main(String[]args) 
	{
		System.out.println("                          1，数组的定义                     ");
		/*数组:保存多个相同类型数据的一种容器!
		声明数组的方式有两种；
		1，数据类型[]数组名 = null;
		2，数据类型[]数组名;
		数组名 = new 数据类型[长度]

		数组的动态初始化:
		在创建数组时，只给定长度，由系统给出默认的初始化值数据类型[]数组名= new 数据类型[长度];
		数组元素访问:数组名[索引]
		数组的索引:给数组中每一个数据提供的编号,从0开始，到数组名.length - 1结束
		数组的长度:数组名.length
		数组的默认初始化值:
		整数类型:0
		小数类型: 0.0
		字符类型:空白字符
		布尔类型:false
		引用类型:null
		*/
		//创建一个int类型的数组
		int[] arr1 = new int[3];
		System.out.println(arr1);
		//输出结果：[I@2f4d3709 [代表数组，I代表数组类型为int，@符号是固定的格式，后面是一串十六进制的内存地址
		//获取数组的长度
		System.out.println(arr1[0]); // 0
		System.out.println(arr1[1]); // 0
		System.out.println(arr1[2]); // 0
		//System.out.println(arr1[3]); // 超出索引范围（运行时才会报错）
		//获取数组的长度
		System.out.println(arr1.length); // 3
		//给数组赋值真实的数据
		System.out.println("---------------------------------------------------------");
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[2] = 30;
		System.out.println(arr1[0]); // 0
		System.out.println(arr1[1]); // 0
		System.out.println(arr1[2]); // 0
		System.out.println("---------------------------------------------------------");
		/*
		 * 数组的静态初始化；在创建数组时，直接将数据给出
		 * 数据类型[] 数组名 = new 数据类型{元素，元素，元素};
		 * 数据类型[] 数据名 = {元素，元素，元素};这两种方法没有区别，第二种只是格式上的简化
		 */
		//创建一个int类型的数组，保存一些数字：10，20，30，40
		int[] arr2 = {10,20,30,40};
		System.out.println(arr2[0]);
		System.out.println(arr2[1]);
		System.out.println(arr2[2]);
		System.out.println("-------------------------------------------------------");
		System.out.println("                        2.数组的遍历                         ");
		int[] arr3 = {10,20,30};
		//遍历数组。获取每一个元素
		for(int i = 0; i < arr3.length; i++) 
		System.out.println(arr3[i]);
		System.out.println("                        3.数组的最值                       ");
		//获取最大值
		//1.记录最大值的变量
		int[] arr4 = {3,5,2,1,4};
		int max = 0;
		//2.遍历剩余的所有数据
		for(int x = 0; x < arr4.length; x++)
		{
		    //2.5.先给max赋值为其中一个元素，不然无法比较负数
		    if(x == 1) 
		    {max = arr4[1];}
			//3.如果当前获取元素大于最大值
		    else if(arr4[x] > max)
			//4.将当前元素重新赋值给max
			{max = arr4[x];}
		}
		// 5.输出最大值的变量
		System.out.println("最大值是"+ max);
		System.out.println("                        4.数组的排序                          ");
		/*冒泡排序，与后一位元素比较，大于后一位则与后一位交换位置
		 * 轮数最多为，数组长度 - 1
		 * 第一轮，比较次数最多为：数组长度 - 1
		 * 比较次数在每一轮比在上一轮少 1
		 * */
		//排序前，遍历数组
		for(int i = 0; i < arr4.length; i++)
		{System.out.print(arr4[i] + " ");}
		System.out.println("");
		//外层循环：用于控制比较的轮数(轮数 = 数组长度 - 1),注意下面是从0开始计算轮数的，一共循环了4轮
		for(int i = 0; i < arr4.length - 1; i++)
		{
			//内层循环，用于控制每轮比较的次数(这组的轮数要多减一个i）
			for(int j = 0; j < arr4.length - 1 - i; j++)
			{
				//判断：相邻的两个元素比较
				if(arr4[j] > arr4[j+1])
				{
					//交换相邻元素的位置
					int temp = arr4[j];
					arr4[j] = arr4[j+1];
					arr4[j+1] = temp;
				}
			}
		}
		//排序后，遍历数组

		for(int i = 0; i < arr4.length; i++)
		{System.out.print(arr4[i] + " ");}
		System.out.println("");
	}
}
